import numpy as np
import matplotlib.pyplot as plt

# 1. 生成0/1数组
ones = np.ones([4, 8], dtype=np.int32)
zeros = np.zeros([4, 8])
print(ones)

ones_like = np.ones_like(zeros)
zeros_like = np.zeros_like(zeros, dtype=np.float64)
print(ones_like)

# 2. 从已有数组生成
a = np.array([[1, 2, 3], [4, 5, 6]])
a1 = np.array(a)  # 深拷贝，a变 a1不变
a2 = np.asarray(a)  # 浅拷贝 a变 a2也跟着变

# 3. 创建固定范围的数组
# 从0 到 100(endpoint=True代表包含100) 等距离生成 11个数
# array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])
np.linspace(0, 100, 11, endpoint=True)

# 从10 到 100(默认包含100) 每隔 2生成一个数
# array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
#        44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76,
#        78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98])
np.arange(10, 100, 2)

# 从10^0 到10^2 生成等距离生成 3个数
# array([  1.,  10., 100.])
np.logspace(0, 2, 3)

# 4.生成随机数组 numpy.random
# 4.1 正态分布
# 生成均值为1.75，标准差为1的正态分布数据，样本值为100000个
x1 = np.random.normal(1.75, 1, 100000000)
# plt.figure(figsize=(10, 8), dpi=80)
# plt.hist(x1, 1000)
# plt.show()

# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
from pylab import mpl

# 设置中文字体
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 设置正常显示符号
mpl.rcParams['axes.unicode_minus'] = False
stock_change = np.random.normal(0, 1, [4, 5])
# plt.figure(figsize=(10, 8), dpi=80)
# plt.plot(range(1, 5), [stock_change[0][j] for j in range(4)], label="股票1")
# plt.plot(range(1, 5), [stock_change[1][j] for j in range(4)], label="股票2")
# plt.plot(range(1, 5), [stock_change[2][j] for j in range(4)], label="股票3")
# plt.plot(range(1, 5), [stock_change[3][j] for j in range(4)], label="股票4")
# plt.legend(loc="best")
# plt.xticks(range(1, 5, 1), labels=[f"第{i}天" for i in range(1,5)][::1])
# plt.show()

# 4.2 均匀分布
x2 = np.random.uniform(-1, 1, 100000000)
# plt.figure(figsize=(10, 8), dpi=80)
# plt.hist(x2, 1000)
# plt.show()

# 5. 数组切片   先索引后切片
stock_change = np.array([[-0.5142373, -0.32586912, 0.39132714, 1.02290317, -0.33438889],
                         [-0.08775205, 1.99655647, 0.24488145, -1.25742494, -0.35522986],
                         [0.85280747, 1.87762957, 0.68582294, 1.05605474, -1.6015672],
                         [-0.53759709, 1.62663522, -0.2319302, -0.27205088, -0.49244907]])
print(stock_change[1, 0:3])  # [-0.08775205  1.99655647  0.24488145]
a1 = np.array([[[1, 2, 3], [4, 5, 6]], [[12, 3, 34], [5, 6, 7]]])
print(a1[0, 1, 2])  # 6

# 6. 数组形状修改
# reshape()不改变行列，只是重新分割，不改变原数组返回新的数组
# 当仅仅确定要重新划分的列的个数的时候，可以用-1代替行，但必须保证行是整数，即"size➗列"能整除
stock_change.reshape([2, 10])
stock_change.reshape(([-1, 4]))
# resize()功能与reshape一致，但是是原地改变
stock_change.resize([10, 2])
print(stock_change)
# T代表转置，改变行列
print(stock_change.T.shape)

# 7. 类型修改
# 返回修改了类型后的数组,非原地
print(stock_change.astype(np.int64))
print(stock_change.tostring())

# 8. 数组去重
a = np.array([[1, 2, 3, 4], [2, 3, 4, 5]])
# array([1, 2, 3, 4, 5])
np.unique(a)
